[レポート] Accelerate Python and .NET Lambda functions with SnapStartに参加しました #AWSreInvent #SVS218-NEW

[レポート] Accelerate Python and .NET Lambda functions with SnapStartに参加しました #AWSreInvent #SVS218-NEW

Clock Icon2024.12.04

はじめに

データ事業本部のkobayashiです。現在ラスベガスで開催されているre:Invent2024に現地参加しています。
本記事は AWS re:Invent 2024 のセッション「SVS218-NEW | [NEW LAUNCH] Accelerate Python and .NET Lambda functions with SnapStart」のセッションレポートです。

Lambdaの起動パフォーマンスの向上を行えるLambda SnapStartがJavaだけではなくPython,.NETでも使うことができるようになったというセッション内容でした。

セッションの概要

タイトル

SVS218-NEW | [NEW LAUNCH] Accelerate Python and .NET Lambda functions with SnapStart

概要

AWS Lambda SnapStart is now available for both Python and .NET functions! SnapStart can reduce cold start duration of functions with few to no code changes, dramatically improving function performance. Join this session to learn more about SnapStart for Python and .NET. Explore how SnapStart works by taking and reusing s, how to easily enable SnapStart for new and existing functions, and how to help ensure your functions and dependencies are snap safe. Leave with Python and .NET Lambda functions that initialize faster.

  • Level:200

スピーカー

  • Leandro Cavalcante Damascena, Specialist SA, Powertools, AWS
  • Samrat Karak, Principal Product Manager, Amazon

内容

はじめに従来のコールドスタートの起動の呼び出しモデルの解説がありました、
図のようにコールドスタートではパッケージのダウンロードと解凍、実行環境の作成、関数の初期化、ハンドラーコードの実行が必要なため実際の関数の処理が始まるまでの時間が必要でした。
スクリーンショット 2024-12-04 1.27.03

このコールドスタートにかかる時間を短縮できる機能がSnapStartであり、この機能がPython,.NETでも使えるようになりました、
スクリーンショット 2024-12-04 1.27.15

Lambda SnapStartの概要です。暗号化されたSnapShotが低レイテンシーキャッシュとして保存され関数ハンドラーを呼び出す前にスナップショットを復元します。
低レイテンシーキャッシュから復元するためコールドスタートにかかる時間に比べ非常に短い時間でLambdaを起動することができます。
スクリーンショット 2024-12-04 1.31.46

前述のOn-Demand Invocation modelとSnapStartのInvocation modelを比較するとOn-Demandのコールドスタート処理をSnapStartではInitで予め実行しそのSnapShotをキャッシュする仕組みになっています。少し異なるのがPre-snapshot hookとPost-snapshot hookの部分になります。
スクリーンショット 2024-12-04 1.32.59

Pre-snapshot hookはLambdaがスナップショットを作成する前に実行するコードで、外部ファイルのダウンロードやコンピューティングリソースを大量に使う前処理のようなIntensiveなタスクを記述し、 Post-snapshot hookはSnapStartがスナップショットが復元されてLambdaハンドラーが実行される前に処理されるコードで、データベースとのコネクションや機密情報の取得などを記述します。
スクリーンショット 2024-12-04 9.36.08

これらは aws/snapshot-restore-py のパッケージを読み込んで使いますが、デコレータとして記述する方法とメソッドとして実行する方法の2パターンが使えます。

from snapshot_restore_py import register_before_snapshot, register_after_restore

def lambda_handler(event, context):
    # lambda handler code
    ...

@register_before_snapshot
def fn_before_snapshot():
    # your logic here
    ...

@register_after_restore
def fn_after_restore():
    # your logic here
    ...
from snapshot_restore_py import register_before_snapshot, register_after_restore

def lambda_handler(event, context):
    # lambda handler code
    ...

def fn_before_snapshot():
    # your logic here
    ...

def fn_after_restore():
    # your logic here
    ...

register_before_snapshot(fn_before_snapshot)
register_after_restore(fn_after_restore)

SnapStartとProvisioned Concurrency

SnapStartとProvisioned Concurrencyは似たように思われる機能ですが、SnapStartはコールドスタートのレイテンシ改善であり、Provisioned Concurrencyはコールドスタートを行わせずにウォームスタートの状態を保つためのものだと言うことを強調されていました。
スクリーンショット 2024-12-04 14.53.36

料金

料金はキャッシュに料金がかかるのとリストアに料金がかかることがポイントですが、SnapStartの料金を下げるためにはとにかくキャッシュにかかる料金を抑えることがポイントで使わなくなった古いバージョンをきちんと削除するようにということでした

スクリーンショット 2024-12-04 14.54.20

他の注意点

  • ユニーク性
    • 初期化時に生成された一意の値(ID、シークレット、ランダム値など)がスナップショットに保存され、複数の実行環境で再利用される。一意性が必要な場合はPost-snapshot hookかハンドラー内で生成するように実装を変更する必要がある。
  • バージョンとエイリアス
    • 公開された関数バージョンとバージョンを指すエイリアスでのみ使用でき、関数の未公開バージョン ($LATEST) ではSnapStartは使用できない。
  • DNSキャッシュ
    • Pythonではrequestsとurllib3ではDNSをキャッシュしない
    • .NETではリスト味に自動的にソケット接続が自動的に確立される

セッション後談

セッション後にスピーカーの一人であるLeandro Cavalcante Damascenaと直接喋る機会がありました。セッション内容にはなかった自分が気になっていた2つの質問をしたのですが以下の回答をいただきました。

  • スナップショットを作成したあとにPythonのバグフィクスなどがありPythonのバージョンが変わった場合はスナップが自動的に再作成されるのか?
    • 自動的に再作成されることはないので運用を考えて再作成をしてください。
  • Java,Python,.NETとSnapStartのできる言語が増えてきたので今後も追加がされる予定はあるのか?
    • 今のところロードマップにはない。要望を上げてくれれば可能性はある。

まとめ

「SVS218-NEW | [NEW LAUNCH] Accelerate Python and .NET Lambda functions with SnapStart」のセッションレポートをお届けしました。

セッションを受けてLambdaは十分高速に実行すると感じていましたがSnapStartを使うことでコールドスタートの時間を短縮できるのであれば費用対効果を考えて積極的に使っていくべき機能だと思いました。

最後まで読んで頂いてありがとうございました。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.